package com.hxgis.common.utils;


import java.math.BigDecimal;
import java.util.List;

public class DistanceUtil {
    private static final double EARTH_RADIUS = 6378.137; // 地球半径

    private static double rad(double d) {
        return d * Math.PI / 180.0;
    }



    /**
     * 计算地球上任意两点(经纬度)距离
     *
     * @param longitude1 第一点经度
     * @param latitude1  第一点纬度
     * @param longitude2 第二点经度
     * @param latitude2  第二点纬度
     * @return 返回距离 单位：米
     */
    public static double countDistance(String longitude1, String latitude1, String longitude2, String latitude2) {
        // 纬度
        double lat1 = Math.toRadians(Double.valueOf(latitude1));
        double lat2 = Math.toRadians(Double.valueOf(latitude2));
        // 经度
        double lng1 = Math.toRadians(Double.valueOf(longitude1));
        double lng2 = Math.toRadians(Double.valueOf(longitude2));
        // 纬度之差
        double a = lat1 - lat2;
        // 经度之差
        double b = lng1 - lng2;
        // 计算两点距离的公式
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
                Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(b / 2), 2)));
        // 弧长乘地球半径, 返回单位: 千米
        s =  s * EARTH_RADIUS;
        return s;
    }
    /**
     * 计算地球上任意两点(经纬度)距离
     *
     * @param longitude1 第一点经度
     * @param latitude1  第一点纬度
     * @param longitude2 第二点经度
     * @param latitude2  第二点纬度
     * @return 返回距离 单位：米
     */
    public static double countDistance(double longitude1, double latitude1, double longitude2, double latitude2) {
        // 纬度
        double lat1 = Math.toRadians(latitude1);
        double lat2 = Math.toRadians(latitude2);
        // 经度
        double lng1 = Math.toRadians(longitude1);
        double lng2 = Math.toRadians(longitude2);
        // 纬度之差
        double a = lat1 - lat2;
        // 经度之差
        double b = lng1 - lng2;
        // 计算两点距离的公式
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
                Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(b / 2), 2)));
        // 弧长乘地球半径, 返回单位: 千米
        s =  s * EARTH_RADIUS;
        return s;
    }

    //计算格点面积
    public static double countArea(double lat){
        return 2 * 2 * 110 * 110 * Math.cos(Math.PI * lat / 180);
    }


    public static double countAreas(List<Double> lattitues){
        BigDecimal bigDecimal = new BigDecimal(0);
        for (double lat : lattitues) {
            double v = 2 * 2 * 110 * 110 * Math.cos(Math.PI * lat / 180);
            BigDecimal bigDecimal2 = new BigDecimal(v);
            bigDecimal = bigDecimal.add(bigDecimal2);
        }
        return bigDecimal.doubleValue();
    }


    public static void main(String[] args) {
        System.out.println(countDistance(117.20067533169515, 28.316616992574325, 110.30123015928802, 26.770716058224934));

        System.out.println(countArea(111.62));
    }

}
